<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('probation_settings', function (Blueprint $table) {
            $table->id();
            $table->timestamps();

            // 设置基本信息
            $table->string('setting_code', 50)->unique(); // 设置编码
            $table->string('setting_name', 100); // 设置名称
            $table->string('setting_type', 50); // general, position_specific, department_specific
            $table->text('description')->nullable(); // 描述

            // 适用范围
            $table->unsignedBigInteger('department_id')->nullable(); // 适用部门
            $table->string('department_name', 100)->nullable();
            $table->unsignedBigInteger('position_id')->nullable(); // 适用岗位
            $table->string('position_name', 100)->nullable();
            $table->string('position_level', 50)->nullable(); // 岗位等级

            // 试岗时长设置
            $table->integer('default_probation_days')->default(90); // 默认试岗天数
            $table->integer('min_probation_days')->default(30); // 最少试岗天数
            $table->integer('max_probation_days')->default(180); // 最多试岗天数
            $table->boolean('allow_extension')->default(true); // 是否允许延期
            $table->integer('max_extension_days')->default(90); // 最多延期天数

            // 薪资待遇设置
            $table->boolean('maintain_original_salary')->default(true); // 保持原薪资
            $table->decimal('probation_salary_percentage', 5, 2)->nullable(); // 试岗薪资百分比
            $table->boolean('include_probation_bonus')->default(false); // 包含试岗奖金
            $table->decimal('bonus_percentage', 5, 2)->nullable(); // 奖金百分比
            $table->boolean('retroactive_adjustment')->default(true); // 追溯调整

            // 考核设置
            $table->integer('assessment_frequency')->default(1); // 考核频率（月）
            $table->json('assessment_criteria')->nullable(); // 考核标准
            $table->decimal('passing_score', 5, 2)->default(80.00); // 及格分数
            $table->decimal('excellent_score', 5, 2)->default(90.00); // 优秀分数
            $table->boolean('require_mentor_assessment')->default(true); // 需要导师考核
            $table->boolean('require_manager_assessment')->default(true); // 需要上级考核

            // 自动操作设置
            $table->boolean('auto_confirm_on_pass')->default(false); // 考核通过自动转正
            $table->boolean('auto_return_on_fail')->default(false); // 考核不通过自动退回
            $table->integer('auto_operation_days_before')->default(7); // 提前几天执行自动操作
            $table->boolean('send_reminder_notifications')->default(true); // 发送提醒通知

            // 通知设置
            $table->json('notification_triggers')->nullable(); // 通知触发点
            $table->json('notification_recipients')->nullable(); // 通知接收人
            $table->integer('reminder_days_before')->default(7); // 提前几天提醒

            // 审批流程设置
            $table->boolean('require_approval')->default(true); // 需要审批
            $table->json('approval_workflow')->nullable(); // 审批流程
            $table->integer('approval_timeout_days')->default(7); // 审批超时天数

            // 状态管理
            $table->boolean('is_active')->default(true); // 是否启用
            $table->boolean('is_default')->default(false); // 是否为默认设置
            $table->integer('priority')->default(1); // 优先级

            // 生效时间
            $table->datetime('effective_from')->nullable(); // 生效开始时间
            $table->datetime('effective_to')->nullable(); // 生效结束时间

            // 备注和附件
            $table->text('notes')->nullable();
            $table->json('attachments')->nullable(); // 相关文档

            // 创建者信息
            $table->string('created_by', 100)->nullable();
            $table->string('updated_by', 100)->nullable();

            // 索引
            $table->index(['setting_type', 'is_active'], 'ps_type_active_idx');
            $table->index(['department_id'], 'ps_dept_idx');
            $table->index(['position_id'], 'ps_pos_idx');
            $table->index(['is_active'], 'ps_active_idx');
            $table->index(['is_default'], 'ps_default_idx');
            $table->index(['priority'], 'ps_priority_idx');
            $table->index(['setting_code'], 'ps_code_idx');

            // 外键约束
            $table->foreign('department_id')->references('id')->on('departments')->onDelete('set null');
            $table->foreign('position_id')->references('id')->on('positions')->onDelete('set null');

            // 唯一约束：每个岗位只能有一个试岗设置
            $table->unique(['position_id', 'is_active'], 'unique_position_setting');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('probation_settings');
    }
};
